package com.sh.bean;




import com.sh.utils.BloomFilter;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 生产者消费者模式的缓冲区
 * 有界阻塞队列
 */

public class RssNewsBuffer {
    // 有界阻塞队列
    private LinkedBlockingQueue<CommonInformationItem> buffer;

    // 去重的Map   ConcurrentHashMap怎么实现的线程安全
    private ConcurrentHashMap<String, String> storedItem;

    // 改用布隆过滤器
    private BloomFilter bloomFilter = new BloomFilter(10000, 500);

    public RssNewsBuffer() {
        this.buffer = new LinkedBlockingQueue<>();
        this.storedItem = new ConcurrentHashMap<>();
    }


    public void add(CommonInformationItem item) {
        // 判断是否已经存在
        if ( bloomFilter.contains(item.getId()) ){
            System.out.println("布隆过滤器判断已经存在了" + item.getId() );
            return;
        } else {
            try {
                buffer.put(item);
                System.out.println("布隆过滤器判断还没有添加过" + item.getId() );
                bloomFilter.add(item.getId());
//                storedItem.put(item.getId(), item.getId());
                // 如果太多的数据的要存，会内存溢出
                // 解决： hash算法， 位图， 布隆过滤器， 跳表， 散列表
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    public CommonInformationItem get() {
        try {
            // 阻塞队列的take方法，从队列中获取一个item，如果队列为空，则一直等待
            return buffer.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

}
